function add(x, y, z) {
  return x + y + z;
}

// 柯里化函数的实现yfCurrying
function yfCurrying(fn) {
  return function curried(...args) {
    // 当已经传入的参数 大于等于 需要的参数时，就执行函数
    if (args.length >= fn.length) {
      // fn(...args)
      // fn.call(this, ...args)
      return fn.apply(this, args); // 把原函数的执行结果返回出去
    } else {
      // 没有达到个数时，需要返回一个新的函数，继续来接受参数
      return function (...args2) {
        // 接收到参数后，需要递归调用curried来检查函数的个数是否达到
        return curried.apply(this, args.concat(args2));
      };
    }
  };
}

var curryAdd = yfCurrying(add);
console.log(curryAdd(10, 20, 30));
console.log(curryAdd(10, 20)(30));
console.log(curryAdd(10)(20)(30));
